// 碰撞监控系统主服务
import locationService from './locationService.js';

/**
 * 碰撞监控系统
 * 在应用启动时初始化，无需页面UI
 */
class CollisionMonitor {
  constructor() {
    this.isRunning = false;
  }
  
  /**
   * 启动监控系统
   */
  start() {
    if (this.isRunning) {
      return;
    }
    
    console.log('启动碰撞监控系统');
    locationService.startMonitoring();
    this.isRunning = true;
    
    // 注册应用生命周期钩子
    this.registerAppHooks();
  }
  
  /**
   * 停止监控系统
   */
  stop() {
    if (!this.isRunning) {
      return;
    }
    
    console.log('停止碰撞监控系统');
    locationService.stopMonitoring();
    this.isRunning = false;
  }
  
  /**
   * 注册应用生命周期钩子
   * 确保在应用进入后台时停止监控，回到前台时重新开始
   */
  registerAppHooks() {
    // 应用进入后台
    uni.onAppHide(() => {
      console.log('应用进入后台，暂停监控');
      locationService.stopMonitoring();
    });
    
    // 应用回到前台
    uni.onAppShow(() => {
      console.log('应用回到前台，恢复监控');
      if (this.isRunning) {
        locationService.startMonitoring();
      }
    });
  }
  
  /**
   * 请求位置权限
   * @returns {Promise} 返回Promise对象
   */
  requestLocationPermission() {
    return new Promise((resolve, reject) => {
      uni.authorize({
        scope: 'scope.userLocation',
        success() {
          resolve(true);
        },
        fail(err) {
          console.error('获取位置权限失败:', err);
          
          // 提示用户手动开启权限
          uni.showModal({
            title: '提示',
            content: '需要位置权限来监控碰撞风险，请在设置中开启位置权限',
            confirmText: '去设置',
            success(res) {
              if (res.confirm) {
                uni.openSetting({
                  success(settingRes) {
                    if (settingRes.authSetting['scope.userLocation']) {
                      resolve(true);
                    } else {
                      reject(new Error('用户拒绝授予位置权限'));
                    }
                  }
                });
              } else {
                reject(new Error('用户取消授予位置权限'));
              }
            }
          });
        }
      });
    });
  }
}

// 创建单例
const collisionMonitor = new CollisionMonitor();

export default collisionMonitor; 